import torch
import numpy as np
#step1：读入数据集
xy = np.loadtxt('diabetes.csv.gz',delimiter=',',dtype=np.float32)#普通显卡只支持float32，分隔符为逗号
x_data = torch.from_numpy(xy[:,:-1])#读取出最后一列之外的所有列的所有行
y_data = torch.from_numpy(xy[:,[-1]])#读取最后一列的所有行

#step2：定义模型
class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        #定义三层网络模型
        self.liner1 = torch.nn.Linear(8, 6)  # 输入的是八维特征，输出为六维
        self.liner2 = torch.nn.Linear(6, 4)  # 承接上一层，输入的是六维特征，输出是四维
        self.liner3 = torch.nn.Linear(4, 1)  # 承接上一层，输入的是四维特征，输出是最后的一维
        self.sigmoid = torch.nn.Sigmoid()      # 引入sigmoid函数

    def forward(self, x):
        # TODO:sigmoid函数的本质就是给线性变化加上非线性的操作 即 激活函数
        x = self.sigmoid(self.liner1(x))
        x = self.sigmoid(self.liner2(x))
        x = self.sigmoid(self.liner3(x))
        return x

modle = Model()
#step3：定义损失函数与优化器
criterion = torch.nn.BCELoss(size_average=False)

optimizer = torch.optim.SGD(modle.parameters(),lr=0.1)

#step4：训练
for epoch in range(100):
    #Forward 前馈
    y_pred = modle(x_data)
    loss = criterion(y_pred,y_data)
    print(epoch,loss.item())
    #Backward 反馈
    optimizer.zero_grad()
    loss.backward()
    #update 更新
    optimizer.step()



model = Model()

